package daos;

import java.util.ArrayList;
import java.util.List;

import models.Casilla;
import models.Inbox;
import models.Mensaje;
import models.Oficina;
import models.RelacionConfianza;
import models.Sistema;

import org.hibernate.classic.Session;


public class Dao_Oficinas {
	//arrays para las bajas y altas
	
	private List<Oficina> oficinasAguardar;
	private List<Oficina> oficinasAeliminar;
	
	private List<Casilla> casillasAguardar;
	private List<Casilla> casillasAeliminar;
	
	private List<RelacionConfianza> relacionesAguardar;
	private List<RelacionConfianza> relacionesAeliminar;
	
	//singleton
	private static Dao_Oficinas instancia;
	
	private Dao_Oficinas() {
		super();
		inicializar_arrays();
	}
	public static Dao_Oficinas getInstancia() {
		if(instancia == null)
		{
			instancia= new Dao_Oficinas();
		}
		return instancia;
	}
	//oficinas
	public void agregarOficinaAguardar(Oficina oficina){
		 oficinasAguardar.add(oficina);
	}
	public void agregarOficinaAeliminar(Oficina oficina){
		 oficinasAeliminar.add(oficina);
	}
	//casillas
	public void agregarCasillaAguardar(Casilla casilla)
	{
		casillasAguardar.add(casilla);
	}
	public void agregarCasillaAeliminar(Casilla casilla)
	{
		casillasAeliminar.add(casilla);
	}
	//relaciones
	public void agregarRelacionAguardar(RelacionConfianza relacion)
	{
		relacionesAguardar.add(relacion);
	}
	public void agregarRelacionAeliminar(RelacionConfianza relacion)
	{
		relacionesAeliminar.add(relacion);
	}
	
	public void inicializar_arrays(){
		this.oficinasAguardar = new ArrayList();
		this.oficinasAeliminar = new ArrayList();
		this.casillasAguardar = new ArrayList();
		this.casillasAeliminar = new ArrayList();
		this.relacionesAguardar = new ArrayList();
		this.relacionesAeliminar = new ArrayList();
	}
	//no sirve por ahora
	public void guardarCambios(){
		HibernateProvider provider = HibernateProvider.getInstance();
        provider.registerPersistentClass(Casilla.class);
        provider.registerPersistentClass(Inbox.class);
        provider.registerPersistentClass(Mensaje.class);
        provider.registerPersistentClass(Oficina.class);
        provider.registerPersistentClass(RelacionConfianza.class);
       
        try {
	        Session session = provider.getSession();
	       
	        //guardo y elimino las oficinas
			for (Oficina oficina : oficinasAguardar){
				session.saveOrUpdate(oficina);
			}
			for (Oficina oficina : oficinasAeliminar){
				session.delete(oficina);
			}
			
			//guardo y elimino las casillas
			for (Casilla casilla : casillasAguardar){
				session.saveOrUpdate(casilla);
			}
			for (Casilla casilla : casillasAeliminar){
				session.delete(casilla);
			}
			
			//guardo y elimino las relaciones de confianza
			
			for (RelacionConfianza relacion : relacionesAguardar){
				session.saveOrUpdate(relacion);
			}
			for (RelacionConfianza relacion : relacionesAeliminar){
				session.delete(relacion);
			}
		    provider.commit();
		    
		    //esto deja en cero lo que hay que guardar y eliminar
		    inicializar_arrays();
        }
        catch (Exception e) {
            e.printStackTrace();
            provider.rollback();
        }
        finally {
            provider.close();
        }
	}
	public void levantarDatos(){
		HibernateProvider provider = HibernateProvider.getInstance();
        provider.registerPersistentClass(Casilla.class);
        provider.registerPersistentClass(Inbox.class);
        provider.registerPersistentClass(Mensaje.class);
        provider.registerPersistentClass(Oficina.class);
        provider.registerPersistentClass(RelacionConfianza.class);
        try {
	        Session session = provider.getSession();
	       
	        //guardo y elimino las oficinas
			for (Oficina oficina : oficinasAguardar){
				session.saveOrUpdate(oficina);
			}
			for (Oficina oficina : oficinasAeliminar){
				session.delete(oficina);
			}
			
			//guardo y elimino las casillas
			for (Casilla casilla : casillasAguardar){
				session.saveOrUpdate(casilla);
			}
			for (Casilla casilla : casillasAeliminar){
				session.delete(casilla);
			}
			
			//guardo y elimino las relaciones de confianza
			
			for (RelacionConfianza relacion : relacionesAguardar){
				session.saveOrUpdate(relacion);
			}
			for (RelacionConfianza relacion : relacionesAeliminar){
				session.delete(relacion);
			}
		    provider.commit();
		    
		    //esto deja en cero lo que hay que guardar y eliminar
		    inicializar_arrays();
        }
        catch (Exception e) {
            e.printStackTrace();
            provider.rollback();
        }
        finally {
            provider.close();
        }
	}


	
}
